iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0

想必大家在做 CTF 時都有遇過「執行程式不知道為什麼不輸出 flag」的情況吧?

這時候最有效的工具之一就是 —— gdb

什麼是 gdb?

  • gdb 是 GNU 的除錯器(GNU Debugger),可以用來啟動/暫停程式、設斷點、單步執行、檢視/修改寄存器與記憶體、快照 stack 與 heap 等。
  • 在 pwn 題裡,gdb 用來找 overflow 偏移、觀察函式參數、讀取 data section 的字串、或在執行時讀出被程式隱藏的 flag。
  • 常配套工具:pwndbggefPEDA

常用 gdb 指令

基本操作

  • gdb ./a.out 啟動 GDB 並載入執行檔
  • start 從 main 開始執行(會停在 main 的第一行)
  • runr 執行程式(不保證停在 main)
  • quitq 離開 GDB

斷點控制

  • b main 在 main 函式入口下斷點
  • b *0x4010a4 在指定位址下斷點(如 main+42)
  • info breakpoints 查看目前斷點狀態
  • delete 刪除所有斷點(或加號碼如 delete 1)
  • disable / enable 關閉 / 啟用某個斷點

程式控制

  • ccontinue 繼續執行直到下個斷點或程式結束
  • sstep 單步執行,進入函式
  • nnext 單步執行,不會進入函式
  • finish 執行到目前函式 return
  • jump *0x401234 強制跳到指定位址

觀察暫存器 / 記憶體

  • info registers 顯示所有暫存器的值(rax, rsp, rip…)
  • p $eax / p $rax 印出指定暫存器的值
  • x/s $rax 把暫存器指到的位址當作字串印出
  • x/4x $rsp 查看記憶體內容(16 進位)
  • x/4gx $rbp-0x30 查看 4 個 64-bit 的值
  • x/i $rip 反組譯目前指令(Instruction)

反組譯與函式分析

  • disassemble main 查看 main 函式的組語
  • info functions 顯示所有可以 call 的函式(沒 debug symbol 時很有用)
  • list 顯示原始碼(若有加 -g 編譯)
  • backtracebt 呼叫堆疊(呼叫順序)

其他實用功能

  • context 顯示當前執行狀態(暫存器、堆疊、程式碼)
  • telescope $rsp 像望遠鏡一樣看堆疊內容
  • set $eax=0x1337 手動修改暫存器數值(很適合繞過邏輯)
  • set {int}0x404040 = 0x1234 修改記憶體中的值
  • layout asm 切換到組合語言視圖模式

picoCTF - GDB baby step 2

這題要用gdb打開,記得先幫檔案加執行權限ㄛㄛ

我自己習慣用layout asm 開視圖模式 因為我菜

這題要看的是main函式,所以先在main下個斷點 → b main
run後可以看到他停在main

https://ithelp.ithome.com.tw/upload/images/20250921/20169105z2UN3VuylD.png

因為他問的是最後的eax值,所以我們可以直接下滑到最後找到<main+60>的位子會回傳值,所以在這邊也下一個斷點 → b *0x401142
然後打c,他會跳到當前的下一個斷點處,也就是<main+60>那個位子
print $eax就能得到eax的值了

https://ithelp.ithome.com.tw/upload/images/20250921/20169105wQpxkY2hVW.png


以上就是今天的內容啦

想看更多,記得明天再來喔~


上一篇
Day25 - 組合語言
下一篇
Day27 - Wasm分析
系列文
一天一題picoCTF:從Easy開始的新手生活27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言